home *** CD-ROM | disk | FTP | other *** search
/ PC/CD Gamer UK 120 / CD Gamer Issue 120 (March 2003) (Disc 2).ISO / mods / Q2_Codered / codeRED1_0.exe / Data1.cab / server.h < prev    next >
Encoding:
C/C++ Source or Header  |  2002-08-13  |  10.0 KB  |  342 lines

  1. /*
  2. Copyright (C) 1997-2001 Id Software, Inc.
  3.  
  4. This program is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU General Public License
  6. as published by the Free Software Foundation; either version 2
  7. of the License, or (at your option) any later version.
  8.  
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  12.  
  13. See the GNU General Public License for more details.
  14.  
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18.  
  19. */
  20. // server.h
  21.  
  22.  
  23. //define    PARANOID            // speed sapping error checking
  24.  
  25. #include "../qcommon/qcommon.h"
  26. #include "../game/game.h"
  27.  
  28. //=============================================================================
  29.  
  30. #define    MAX_MASTERS    8                // max recipients for heartbeat packets
  31.  
  32. typedef enum {
  33.     ss_dead,            // no map loaded
  34.     ss_loading,            // spawning level edicts
  35.     ss_game,            // actively running
  36.     ss_cinematic,
  37.     ss_demo,
  38.     ss_pic
  39. } server_state_t;
  40. // some qc commands are only valid before the server has finished
  41. // initializing (precache commands, static sounds / objects, etc)
  42.  
  43. typedef struct
  44. {
  45.     server_state_t    state;            // precache commands are only valid during load
  46.  
  47.     qboolean    attractloop;        // running cinematics and demos for the local system only
  48.     qboolean    loadgame;            // client begins should reuse existing entity
  49.  
  50.     unsigned    time;                // always sv.framenum * 100 msec
  51.     int            framenum;
  52.  
  53.     char        name[MAX_QPATH];            // map name, or cinematic name
  54.     struct cmodel_s        *models[MAX_MODELS];
  55.  
  56.     char        configstrings[MAX_CONFIGSTRINGS][MAX_QPATH];
  57.     entity_state_t    baselines[MAX_EDICTS];
  58.  
  59.     // the multicast buffer is used to send a message to a set of clients
  60.     // it is only used to marshall data until SV_Multicast is called
  61.     sizebuf_t    multicast;
  62.     byte        multicast_buf[MAX_MSGLEN];
  63.  
  64.     // demo server information
  65.     FILE        *demofile;
  66.     qboolean    timedemo;        // don't time sync
  67. } server_t;
  68.  
  69. #define EDICT_NUM(n) ((edict_t *)((byte *)ge->edicts + ge->edict_size*(n)))
  70. #define NUM_FOR_EDICT(e) ( ((byte *)(e)-(byte *)ge->edicts ) / ge->edict_size)
  71.  
  72.  
  73. typedef enum
  74. {
  75.     cs_free,        // can be reused for a new connection
  76.     cs_zombie,        // client has been disconnected, but don't reuse
  77.                     // connection for a couple seconds
  78.     cs_connected,    // has been assigned to a client_t, but not in game yet
  79.     cs_spawned        // client is fully in game
  80. } client_state_t;
  81.  
  82. typedef struct
  83. {
  84.     int                    areabytes;
  85.     byte                areabits[MAX_MAP_AREAS/8];        // portalarea visibility bits
  86.     player_state_t        ps;
  87.     int                    num_entities;
  88.     int                    first_entity;        // into the circular sv_packet_entities[]
  89.     int                    senttime;            // for ping calculations
  90. } client_frame_t;
  91.  
  92. #define    LATENCY_COUNTS    16
  93. #define    RATE_MESSAGES    10
  94.  
  95. typedef struct client_s
  96. {
  97.     client_state_t    state;
  98.  
  99.     char            userinfo[MAX_INFO_STRING];        // name, etc
  100.  
  101.     int                lastframe;            // for delta compression
  102.     usercmd_t        lastcmd;            // for filling in big drops
  103.  
  104.     int                commandMsec;        // every seconds this is reset, if user
  105.                                         // commands exhaust it, assume time cheating
  106.  
  107.     int                frame_latency[LATENCY_COUNTS];
  108.     int                ping;
  109.  
  110.     int                message_size[RATE_MESSAGES];    // used to rate drop packets
  111.     int                rate;
  112.     int                surpressCount;        // number of messages rate supressed
  113.  
  114.     edict_t            *edict;                // EDICT_NUM(clientnum+1)
  115.     char            name[32];            // extracted from userinfo, high bits masked
  116.     int                messagelevel;        // for filtering printed messages
  117.  
  118.     // The datagram is written to by sound calls, prints, temp ents, etc.
  119.     // It can be harmlessly overflowed.
  120.     sizebuf_t        datagram;
  121.     byte            datagram_buf[MAX_MSGLEN];
  122.  
  123.     client_frame_t    frames[UPDATE_BACKUP];    // updates can be delta'd from here
  124.  
  125.     byte            *download;            // file being downloaded
  126.     int                downloadsize;        // total bytes (can't use EOF because of paks)
  127.     int                downloadcount;        // bytes sent
  128.  
  129.     int                lastmessage;        // sv.framenum when packet was last received
  130.     int                lastconnect;
  131.  
  132.     int                challenge;            // challenge of this user, randomly generated
  133.  
  134.     netchan_t        netchan;
  135. } client_t;
  136.  
  137. // a client can leave the server in one of four ways:
  138. // dropping properly by quiting or disconnecting
  139. // timing out if no valid messages are received for timeout.value seconds
  140. // getting kicked off by the server operator
  141. // a program error, like an overflowed reliable buffer
  142.  
  143. //=============================================================================
  144.  
  145. // MAX_CHALLENGES is made large to prevent a denial
  146. // of service attack that could cycle all of them
  147. // out before legitimate users connected
  148. #define    MAX_CHALLENGES    1024
  149.  
  150. typedef struct
  151. {
  152.     netadr_t    adr;
  153.     int            challenge;
  154.     int            time;
  155. } challenge_t;
  156.  
  157.  
  158. typedef struct
  159. {
  160.     qboolean    initialized;                // sv_init has completed
  161.     int            realtime;                    // always increasing, no clamping, etc
  162.  
  163.     char        mapcmd[MAX_TOKEN_CHARS];    // ie: *intro.cin+base 
  164.  
  165.     int            spawncount;                    // incremented each server start
  166.                                             // used to check late spawns
  167.  
  168.     client_t    *clients;                    // [maxclients->value];
  169.     int            num_client_entities;        // maxclients->value*UPDATE_BACKUP*MAX_PACKET_ENTITIES
  170.     int            next_client_entities;        // next client_entity to use
  171.     entity_state_t    *client_entities;        // [num_client_entities]
  172.  
  173.     int            last_heartbeat;
  174.  
  175.     challenge_t    challenges[MAX_CHALLENGES];    // to prevent invalid IPs from connecting
  176.  
  177.     // serverrecord values
  178.     FILE        *demofile;
  179.     sizebuf_t    demo_multicast;
  180.     byte        demo_multicast_buf[MAX_MSGLEN];
  181. } server_static_t;
  182.  
  183. //=============================================================================
  184.  
  185. extern    netadr_t    net_from;
  186. extern    sizebuf_t    net_message;
  187.  
  188. extern    netadr_t    master_adr[MAX_MASTERS];    // address of the master server
  189.  
  190. extern    server_static_t    svs;                // persistant server info
  191. extern    server_t        sv;                    // local server
  192.  
  193. extern    cvar_t        *sv_paused;
  194. extern    cvar_t        *maxclients;
  195. extern    cvar_t        *sv_noreload;            // don't reload level state when reentering
  196. extern    cvar_t        *sv_airaccelerate;        // don't reload level state when reentering
  197.                                             // development tool
  198. extern    cvar_t        *sv_enforcetime;
  199.  
  200. extern    client_t    *sv_client;
  201. extern    edict_t        *sv_player;
  202.  
  203. //===========================================================
  204.  
  205. //
  206. // sv_main.c
  207. //
  208. void SV_FinalMessage (char *message, qboolean reconnect);
  209. void SV_DropClient (client_t *drop);
  210.  
  211. int SV_ModelIndex (char *name);
  212. int SV_SoundIndex (char *name);
  213. int SV_ImageIndex (char *name);
  214.  
  215. void SV_WriteClientdataToMessage (client_t *client, sizebuf_t *msg);
  216.  
  217. void SV_ExecuteUserCommand (char *s);
  218. void SV_InitOperatorCommands (void);
  219.  
  220. void SV_SendServerinfo (client_t *client);
  221. void SV_UserinfoChanged (client_t *cl);
  222.  
  223.  
  224. void Master_Heartbeat (void);
  225. void Master_Packet (void);
  226.  
  227. //
  228. // sv_init.c
  229. //
  230. void SV_InitGame (void);
  231. void SV_Map (qboolean attractloop, char *levelstring, qboolean loadgame);
  232.  
  233.  
  234. //
  235. // sv_phys.c
  236. //
  237. void SV_PrepWorldFrame (void);
  238.  
  239. //
  240. // sv_send.c
  241. //
  242. typedef enum {RD_NONE, RD_CLIENT, RD_PACKET} redirect_t;
  243. #define    SV_OUTPUTBUF_LENGTH    (MAX_MSGLEN - 16)
  244.  
  245. extern    char    sv_outputbuf[SV_OUTPUTBUF_LENGTH];
  246.  
  247. void SV_FlushRedirect (int sv_redirected, char *outputbuf);
  248.  
  249. void SV_DemoCompleted (void);
  250. void SV_SendClientMessages (void);
  251.  
  252. void SV_Multicast (vec3_t origin, multicast_t to);
  253. void SV_StartSound (vec3_t origin, edict_t *entity, int channel,
  254.                     int soundindex, float volume,
  255.                     float attenuation, float timeofs);
  256. void SV_ClientPrintf (client_t *cl, int level, char *fmt, ...);
  257. void SV_BroadcastPrintf (int level, char *fmt, ...);
  258. void SV_BroadcastCommand (char *fmt, ...);
  259.  
  260. //
  261. // sv_user.c
  262. //
  263. void SV_Nextserver (void);
  264. void SV_ExecuteClientMessage (client_t *cl);
  265.  
  266. //
  267. // sv_ccmds.c
  268. //
  269. void SV_ReadLevelFile (void);
  270. void SV_Status_f (void);
  271.  
  272. //
  273. // sv_ents.c
  274. //
  275. void SV_WriteFrameToClient (client_t *client, sizebuf_t *msg);
  276. void SV_RecordDemoMessage (void);
  277. void SV_BuildClientFrame (client_t *client);
  278.  
  279.  
  280. void SV_Error (char *error, ...);
  281.  
  282. //
  283. // sv_game.c
  284. //
  285. extern    game_export_t    *ge;
  286.  
  287. void SV_InitGameProgs (void);
  288. void SV_ShutdownGameProgs (void);
  289. void SV_InitEdict (edict_t *e);
  290.  
  291.  
  292.  
  293. //============================================================
  294.  
  295. //
  296. // high level object sorting to reduce interaction tests
  297. //
  298.  
  299. void SV_ClearWorld (void);
  300. // called after the world model has been loaded, before linking any entities
  301.  
  302. void SV_UnlinkEdict (edict_t *ent);
  303. // call before removing an entity, and before trying to move one,
  304. // so it doesn't clip against itself
  305.  
  306. void SV_LinkEdict (edict_t *ent);
  307. // Needs to be called any time an entity changes origin, mins, maxs,
  308. // or solid.  Automatically unlinks if needed.
  309. // sets ent->v.absmin and ent->v.absmax
  310. // sets ent->leafnums[] for pvs determination even if the entity
  311. // is not solid
  312.  
  313. int SV_AreaEdicts (vec3_t mins, vec3_t maxs, edict_t **list, int maxcount, int areatype);
  314. // fills in a table of edict pointers with edicts that have bounding boxes
  315. // that intersect the given area.  It is possible for a non-axial bmodel
  316. // to be returned that doesn't actually intersect the area on an exact
  317. // test.
  318. // returns the number of pointers filled in
  319. // ??? does this always return the world?
  320.  
  321. //===================================================================
  322.  
  323. //
  324. // functions that interact with everything apropriate
  325. //
  326. int SV_PointContents (vec3_t p);
  327. // returns the CONTENTS_* value from the world at the given point.
  328. // Quake 2 extends this to also check entities, to allow moving liquids
  329.  
  330.  
  331. trace_t SV_Trace (vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, edict_t *passedict, int contentmask);
  332. // mins and maxs are relative
  333.  
  334. // if the entire move stays in a solid volume, trace.allsolid will be set,
  335. // trace.startsolid will be set, and trace.fraction will be 0
  336.  
  337. // if the starting point is in a solid, it will be allowed to move out
  338. // to an open area
  339.  
  340. // passedict is explicitly excluded from clipping checks (normally NULL)
  341.  
  342.